Micron Document
๐ŸŽ–๏ธGitะฏั€ะฐ๐ŸŽ–๏ธ

Node / meshtastic / Meshtastic-Android / files / .coderabbit.yaml

Displaying Raw โ€ข Download

.coderabbit.yaml gh-readonly-queue/main/pr-6582-5ee5a5b6483b2fdfc82ae56ad2976254b733a999 (099fd7f9) Text, 8.54 KB

T8b949e# yaml-language-server: $schema=https://coderabbit.ai/integrations/schema.v2.json
T8b949e# CodeRabbit config โ€” see https://docs.coderabbit.ai/getting-started/yaml-configuration
Tff7b72languageTb4b4b4: Ta5d6ffen-US

Tff7b72reviewsTb4b4b4:
T8b949e# chill = fewer nitpicks. CI already gates detekt/spotless/tests, and the
T8b949e# maintainers are experienced โ€” we want CodeRabbit for substance, not lint noise.
Tff7b72profileTb4b4b4: Ta5d6ffchill
Tff7b72high_level_summaryTb4b4b4: Ta5d6fftrue
Tff7b72poemTb4b4b4: Ta5d6fffalse
T8b949e# Don't burn reviews on WIP. This repo opens lots of draft PRs; review on "ready".
T8b949e# Skip Renovate dependency updates โ€” CI gates dependencies; we review for substance, not every bump.
Tff7b72auto_reviewTb4b4b4:
Tff7b72enabledTb4b4b4: Ta5d6fftrue
Tff7b72draftsTb4b4b4: Ta5d6fffalse
T8b949e# Review once when the PR goes ready, then on demand via `@coderabbitai review`.
T8b949e# Re-reviewing every push turned 6-commit PRs into 8 review rounds, because each
T8b949e# fix commit reopened a full pass. Batch the fixes, push, then ask for one re-review.
Tff7b72auto_incremental_reviewTb4b4b4: Ta5d6fffalse
Tff7b72ignore_usernamesTb4b4b4:
Tb4b4b4- Ta5d6ffrenovate
Tb4b4b4- Ta5d6ffrenovate[bot]
T8b949e# Workflow-authored PRs (changelog updates, scheduled firmware/hardware/
T8b949e# translation bumps) โ€” machine-generated content, nothing to review.
Tb4b4b4- Ta5d6ffgithub-actions
Tb4b4b4- Ta5d6ffgithub-actions[bot]
Tff7b72ignore_title_keywordsTb4b4b4:
Tb4b4b4- Ta5d6ff"Ta5d6ffchore:Te6edf3 Ta5d6ffScheduledTe6edf3 Ta5d6ffupdatesTa5d6ff"
T8b949e# Stop reviewing once a PR is closed.
Tff7b72abort_on_closeTb4b4b4: Ta5d6fftrue

Tff7b72path_filtersTb4b4b4:
T8b949e# Generated / huge / non-source โ€” don't review, just noise + token burn.
Tb4b4b4- Ta5d6ff"Ta5d6ff!**/build/**Ta5d6ff"
Tb4b4b4- Ta5d6ff"Ta5d6ff!**/*.pngTa5d6ff"
Tb4b4b4- Ta5d6ff"Ta5d6ff!**/*.webpTa5d6ff"
Tb4b4b4- Ta5d6ff"Ta5d6ff!**/firmware_releases.jsonTa5d6ff"
Tb4b4b4- Ta5d6ff"Ta5d6ff!**/emoji-data.jsonTa5d6ff"
Tb4b4b4- Ta5d6ff"Ta5d6ff!**/flatpak-sources.jsonTa5d6ff"
T8b949e# Crowdin-managed translations โ€” owned upstream, not hand-edited here.
Tb4b4b4- Ta5d6ff"Ta5d6ff!**/values-*/strings.xmlTa5d6ff"
T8b949e# Spec Kit scaffolding โ€” vendored tooling, not hand-maintained here.
Tb4b4b4- Ta5d6ff"Ta5d6ff!.specify/**Ta5d6ff"

Tff7b72path_instructionsTb4b4b4:
Tb4b4b4- Tff7b72pathTb4b4b4: Ta5d6ff"Ta5d6ff**/commonMain/**Ta5d6ff"
Tff7b72instructionsTb4b4b4: Tb4b4b4>
Tff7b72KMP common code. Flag any import of java.* or android.* โ€” these break non-Android targets. Expect KMP equivalents instead (Okio, kotlinx Mutex/atomicfu, NumberFormatter.format() for floats).
Tb4b4b4- Tff7b72pathTb4b4b4: Ta5d6ff"Ta5d6ff**/*.ktTa5d6ff"
Tff7b72instructionsTb4b4b4: Tb4b4b4>
Tff7b72Flag leftover // ... existing code ... placeholders, and any logging of PII, location, or cryptographic keys.
Tb4b4b4- Tff7b72pathTb4b4b4: Ta5d6ff"Ta5d6ff**/src/**/strings.xmlTa5d6ff"
Tff7b72instructionsTb4b4b4: Tb4b4b4>
Tff7b72New string resources must be alphabetically sorted (scripts/sort-strings.py). Flag out-of-order additions.
Tb4b4b4- Tff7b72pathTb4b4b4: Ta5d6ffbaselineprofile/
Tff7b72instructionsTb4b4b4: Ta5d6ffKeepTa5d6ff Ta5d6ffbaselineTa5d6ff Ta5d6ffprofileTa5d6ff Ta5d6ffgenerationTa5d6ff Ta5d6fftiedTa5d6ff Ta5d6fftoTa5d6ff Ta5d6fftheTa5d6ff Ta5d6ff`google`Ta5d6ff Ta5d6ffflavorTa5d6ff Ta5d6ffandTa5d6ff Ta5d6ffconnectedTa5d6ff Ta5d6ffdevices/emulators,Ta5d6ff Ta5d6ffandTa5d6ff Ta5d6ffcommitTa5d6ff Ta5d6fftheTa5d6ff Ta5d6ffgeneratedTa5d6ff Ta5d6ffprofileTa5d6ff Ta5d6ffoutputTa5d6ff Ta5d6fftoTa5d6ff Ta5d6ff`androidApp/src/google/generated/baselineProfiles/baseline-prof.txt`.
Tb4b4b4- Tff7b72pathTb4b4b4: Ta5d6ffdocs/
Tff7b72instructionsTb4b4b4: Ta5d6ffTreatTa5d6ff Ta5d6ffnon-EnglishTa5d6ff Ta5d6fflocaleTa5d6ff Ta5d6fffoldersTa5d6ff Ta5d6ffasTa5d6ff Ta5d6ffCrowdin-managedTa5d6ff Ta5d6ffoutput;Ta5d6ff Ta5d6ffeditTa5d6ff Ta5d6fftheTa5d6ff Ta5d6ffEnglishTa5d6ff Ta5d6ffsourcesTa5d6ff Ta5d6ffunderTa5d6ff Ta5d6ff`docs/en/`Ta5d6ff Ta5d6ffandTa5d6ff Ta5d6ffregisterTa5d6ff Ta5d6ffnewTa5d6ff Ta5d6ffpagesTa5d6ff Ta5d6ffthroughTa5d6ff Ta5d6ff`feature/docs/`Ta5d6ff Ta5d6ffinsteadTa5d6ff Ta5d6ffofTa5d6ff Ta5d6ffhand-editingTa5d6ff Ta5d6fftranslatedTa5d6ff Ta5d6fflocaleTa5d6ff Ta5d6ffdirectories.
Tb4b4b4- Tff7b72pathTb4b4b4: Ta5d6ffscreenshot-tests/
Tff7b72instructionsTb4b4b4: Ta5d6ffWhenTa5d6ff Ta5d6ffupdatingTa5d6ff Ta5d6ffdocsTa5d6ff Ta5d6ffscreenshots,Ta5d6ff Ta5d6ffkeepTa5d6ff Ta5d6ff`docs-screenshots-manifest.txt`Ta5d6ff Ta5d6ffandTa5d6ff Ta5d6ff`docs-screenshot-aliases.properties`Ta5d6ff Ta5d6ffinTa5d6ff Ta5d6ffsyncTa5d6ff Ta5d6ffwithTa5d6ff Ta5d6fftheTa5d6ff Ta5d6ffgeneratedTa5d6ff Ta5d6fffiles,Ta5d6ff Ta5d6ffandTa5d6ff Ta5d6ffrerunTa5d6ff Ta5d6ff`copyDocsScreenshots`Ta5d6ff Ta5d6ffafterTa5d6ff Ta5d6ffregeneratingTa5d6ff Ta5d6ffscreenshots.
Tb4b4b4- Tff7b72pathTb4b4b4: Ta5d6ffdocs-screenshots/
Tff7b72instructionsTb4b4b4: Ta5d6ffKeepTa5d6ff Ta5d6ffthisTa5d6ff Ta5d6ffmoduleTa5d6ff Ta5d6ffgenerate-onlyTa5d6ff Ta5d6ffforTa5d6ff Ta5d6ffdocumentationTa5d6ff Ta5d6ffscreenshots;Ta5d6ff Ta5d6ffdoTa5d6ff Ta5d6ffnotTa5d6ff Ta5d6ffaddTa5d6ff Ta5d6ffitTa5d6ff Ta5d6fftoTa5d6ff Ta5d6fftheTa5d6ff Ta5d6ffCITa5d6ff Ta5d6ffvalidationTa5d6ff Ta5d6ffgateTa5d6ff Ta5d6ffthatTa5d6ff Ta5d6ffisTa5d6ff Ta5d6ffreservedTa5d6ff Ta5d6ffforTa5d6ff Ta5d6ff`screenshot-tests`.
Tb4b4b4- Tff7b72pathTb4b4b4: Ta5d6ffdesktopApp/
Tff7b72instructionsTb4b4b4: Ta5d6ffKeepTa5d6ff Ta5d6ffdesktopTa5d6ff Ta5d6ffreleaseTa5d6ff Ta5d6ffProGuardTa5d6ff Ta5d6ffrulesTa5d6ff Ta5d6ffalignedTa5d6ff Ta5d6ffwithTa5d6ff Ta5d6ff`androidApp/proguard-rules.pro`,Ta5d6ff Ta5d6ffandTa5d6ff Ta5d6ffpreserveTa5d6ff Ta5d6fftheTa5d6ff Ta5d6ffdesktop-specificTa5d6ff Ta5d6ffruntimeTa5d6ff Ta5d6ffwiringTa5d6ff Ta5d6ffneededTa5d6ff Ta5d6ffforTa5d6ff Ta5d6ff`Dispatchers.Main`Ta5d6ff Ta5d6ffonTa5d6ff Ta5d6ffJVM.
Tb4b4b4- Tff7b72pathTb4b4b4: Ta5d6ffandroidApp/
Tff7b72instructionsTb4b4b4: Ta5d6ffKeepTa5d6ff Ta5d6fftheTa5d6ff Ta5d6ffAndroidTa5d6ff Ta5d6ffappโ€™sTa5d6ff Ta5d6ff`MeshService`Ta5d6ff Ta5d6ffdeclarationTa5d6ff Ta5d6ffandTa5d6ff Ta5d6ffmanifestTa5d6ff Ta5d6ffwiringTa5d6ff Ta5d6ffinTa5d6ff Ta5d6ffsyncTa5d6ff Ta5d6ffwithTa5d6ff Ta5d6fftheTa5d6ff Ta5d6ffimplementationTa5d6ff Ta5d6ffthatTa5d6ff Ta5d6fflivesTa5d6ff Ta5d6ffinTa5d6ff Ta5d6ff`core:service`.
Tb4b4b4- Tff7b72pathTb4b4b4: Ta5d6ffcore/service/
Tff7b72instructionsTb4b4b4: Ta5d6ffKeepTa5d6ff Ta5d6ff`RadioControllerImpl`Ta5d6ff Ta5d6ffcomposedTa5d6ff Ta5d6fffromTa5d6ff Ta5d6ffitsTa5d6ff Ta5d6ffsub-controllersTa5d6ff Ta5d6ffviaTa5d6ff Ta5d6ffinterfaceTa5d6ff Ta5d6ffdelegation;Ta5d6ff Ta5d6ffadminTa5d6ff Ta5d6ffsendsTa5d6ff Ta5d6ffareTa5d6ff Ta5d6fffire-and-forget,Ta5d6ff Ta5d6ffandTa5d6ff Ta5d6ffanyTa5d6ff Ta5d6ffconfigTa5d6ff Ta5d6ffmutationTa5d6ff Ta5d6ffmustTa5d6ff Ta5d6ffgoTa5d6ff Ta5d6ffthroughTa5d6ff Ta5d6ff`editSettingsTa5d6ff Ta5d6ff{Ta5d6ff Ta5d6ff}`Ta5d6ff Ta5d6fftransactions.
Tb4b4b4- Tff7b72pathTb4b4b4: Ta5d6fffeature/docs/
Tff7b72instructionsTb4b4b4: Ta5d6ffTreatTa5d6ff Ta5d6fftheTa5d6ff Ta5d6ffComposeTa5d6ff Ta5d6ffresourcesTa5d6ff Ta5d6ffunderTa5d6ff Ta5d6ff`src/commonMain/composeResources/files/`Ta5d6ff Ta5d6ffasTa5d6ff Ta5d6ffgeneratedTa5d6ff Ta5d6ffoutputTa5d6ff Ta5d6fffromTa5d6ff Ta5d6ff`/docs/en/**`Ta5d6ff Ta5d6ffandTa5d6ff Ta5d6fftranslatedTa5d6ff Ta5d6ffdocsTa5d6ff Ta5d6ffsyncTa5d6ff Ta5d6fftasks;Ta5d6ff Ta5d6ffdoTa5d6ff Ta5d6ffnotTa5d6ff Ta5d6ffhand-editTa5d6ff Ta5d6ffthoseTa5d6ff Ta5d6ffcopiedTa5d6ff Ta5d6fffiles.
Tb4b4b4- Tff7b72pathTb4b4b4: Ta5d6fffeature/map/
Tff7b72instructionsTb4b4b4: Ta5d6ffRouteTa5d6ff Ta5d6ffmapTa5d6ff Ta5d6ffaccessTa5d6ff Ta5d6ffthroughTa5d6ff Ta5d6fftheTa5d6ff Ta5d6ffinjectedTa5d6ff Ta5d6ff`CompositionLocal`Ta5d6ff Ta5d6ffproviderTa5d6ff Ta5d6ffcontracts;Ta5d6ff Ta5d6ffdoTa5d6ff Ta5d6ffnotTa5d6ff Ta5d6ffdependTa5d6ff Ta5d6ffdirectlyTa5d6ff Ta5d6ffonTa5d6ff Ta5d6ffGoogleTa5d6ff Ta5d6ffMapsTa5d6ff Ta5d6fforTa5d6ff Ta5d6ffosmdroidTa5d6ff Ta5d6fffromTa5d6ff Ta5d6fffeatureTa5d6ff Ta5d6ffcode.
Tb4b4b4- Tff7b72pathTb4b4b4: Ta5d6fffeature/car/
Tff7b72instructionsTb4b4b4: Ta5d6ffRunTa5d6ff Ta5d6ffunitTa5d6ff Ta5d6fftestsTa5d6ff Ta5d6ffwithTa5d6ff Ta5d6ff`./gradlewTa5d6ff Ta5d6ff:feature:car:testGoogleDebugUnitTest`,Ta5d6ff Ta5d6ffandTa5d6ff Ta5d6ffkeepTa5d6ff Ta5d6ffRobolectricTa5d6ff Ta5d6ffpinnedTa5d6ff Ta5d6fftoTa5d6ff Ta5d6ffSDKTa5d6ff Ta5d6ff36Ta5d6ff Ta5d6ffforTa5d6ff Ta5d6ffthisTa5d6ff Ta5d6ffmodule.

T8b949e# Every CodeRabbit tool is enabled by default, so this block only ever needs to
T8b949e# turn things OFF or configure them. detekt is off because CI owns it (Zero Lint
T8b949e# Tolerance gate) and duplicate comments were the noise we removed. The scanners
T8b949e# CI doesn't run โ€” gitleaks, shellcheck, actionlint, zizmor, semgrep, trivy,
T8b949e# presidio (PII), buf (protobuf) โ€” are already on by default; don't re-list them.
Tff7b72toolsTb4b4b4:
Tff7b72detektTb4b4b4:
Tff7b72enabledTb4b4b4: Ta5d6fffalse
T8b949e# Custom AST rules mechanically enforce the recurring defect classes that prose
T8b949e# can't. See .coderabbit/ast-grep-rules/ and .skills/code-review/SKILL.md.
T8b949e# essential_rules stays on (default) โ€” these are additive.
Tff7b72ast-grepTb4b4b4:
Tff7b72rule_dirsTb4b4b4:
Tb4b4b4- Ta5d6ff"Ta5d6ff.coderabbit/ast-grep-rulesTa5d6ff"

T8b949e# Auto-generated docstrings/tests/autofix are noisy for a repo with strict
T8b949e# human-authored KDoc and KMP-aware tests; leave finishing touches off.
Tff7b72finishing_touchesTb4b4b4:
Tff7b72docstringsTb4b4b4:
Tff7b72enabledTb4b4b4: Ta5d6fffalse
Tff7b72unit_testsTb4b4b4:
Tff7b72enabledTb4b4b4: Ta5d6fffalse

T8b949e# No KDoc-coverage mandate in this repo; the default warning-at-80% check
T8b949e# would nag every PR. PR titles are already linted by CI
T8b949e# (.github/workflows/pull-request-target.yml), so no title check here either.
Tff7b72pre_merge_checksTb4b4b4:
Tff7b72docstringsTb4b4b4:
Tff7b72modeTb4b4b4: Ta5d6ff"Ta5d6ffoffTa5d6ff"
T8b949e# The two defect classes that survive review-by-prose because they are about
T8b949e# what's ABSENT from a diff โ€” a sibling call site left unfixed, or a test that
T8b949e# would still pass with the fix reverted. Warning, not error: these are
T8b949e# judgment calls and a false positive must not block a merge.
Tff7b72custom_checksTb4b4b4:
Tb4b4b4- Tff7b72nameTb4b4b4: Ta5d6ff"Ta5d6ffSiblingTe6edf3 Ta5d6ffcallTe6edf3 Ta5d6ffsitesTe6edf3 Ta5d6ffandTe6edf3 Ta5d6ffpresenceTe6edf3 Ta5d6ffsemanticsTa5d6ff"
Tff7b72modeTb4b4b4: Ta5d6ff"Ta5d6ffwarningTa5d6ff"
Tff7b72instructionsTb4b4b4: Tb4b4b4>Tb4b4b4-
Tff7b72When a diff changes how an absent value is represented โ€” making a field nullable,
Tff7b72removing a zero-guard, or adding a presence check โ€” verify EVERY call site of that
Tff7b72field was updated, not just the one the bug was reported against. Ambient temperature
Tff7b72was fixed in NodeItem.kt while its sibling NodeItemCompact.kt kept the zero-guard.
Tff7b72Name any unfixed sibling explicitly. Also flag a new field defaulting to 0 where 0 is
Tff7b72a physically reachable value on that scale (RSSI, temperature, current, voltage,
Tff7b72particulate concentration). Two exceptions, do NOT flag either: humidity, where 0 %RH
Tff7b72is unreachable and the guard is intentional and tested; and the proto `rx_snr`, which
Tff7b72has no presence upstream, so its 0f ambiguity cannot be fixed app-side. An app-level
Tff7b72SNR field that IS nullable is still in scope.
Tb4b4b4- Tff7b72nameTb4b4b4: Ta5d6ff"Ta5d6ffTestsTe6edf3 Ta5d6ffproveTe6edf3 Ta5d6fftheTe6edf3 Ta5d6ffpath,Te6edf3 Ta5d6ffnotTe6edf3 Ta5d6fftheTe6edf3 Ta5d6ffendTe6edf3 Ta5d6ffstateTa5d6ff"
Tff7b72modeTb4b4b4: Ta5d6ff"Ta5d6ffwarningTa5d6ff"
Tff7b72instructionsTb4b4b4: Tb4b4b4>Tb4b4b4-
Tff7b72For each added or changed test, decide whether it would still pass if the production
Tff7b72code it covers were reverted. Flag tests that seed a fake's backing store and then
Tff7b72assert the value comes back, tests that assert only a collection's size rather than
Tff7b72which items survived, and tests asserting emission ORDER under Dispatchers.Unconfined
Tff7b72(not a stable contract). A test must assert the side effect only the intended path
Tff7b72produces โ€” a call counter, a request issued, a cache written.

Tff7b72knowledge_baseTb4b4b4:
T8b949e# Learnings are how a confirmed finding stops recurring on the next PR. Pin the
T8b949e# scope to this repo: the default `auto` already resolves to `local` for public
T8b949e# repos, but being explicit keeps it from shifting if visibility ever changes.
Tff7b72learningsTb4b4b4:
Tff7b72scopeTb4b4b4: Ta5d6fflocal
T8b949e# Feed CodeRabbit the same guidance human/AI contributors follow, including
T8b949e# the repo-specific .skills/ modules and Copilot path instructions it
T8b949e# wouldn't pick up by default.
Tff7b72code_guidelinesTb4b4b4:
Tff7b72enabledTb4b4b4: Ta5d6fftrue
Tff7b72filePatternsTb4b4b4:
Tb4b4b4- Ta5d6ff"Ta5d6ffAGENTS.mdTa5d6ff"
Tb4b4b4- Ta5d6ff"Ta5d6ffCLAUDE.mdTa5d6ff"
Tb4b4b4- Ta5d6ff"Ta5d6ff.skills/**/SKILL.mdTa5d6ff"
Tb4b4b4- Ta5d6ff"Ta5d6ff.github/copilot-instructions.mdTa5d6ff"
Tb4b4b4- Ta5d6ff"Ta5d6ff.github/instructions/*.instructions.mdTa5d6ff"

Served by rngit 1.5.2 - Generated in 0.09s